<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">

	<title>Tiny editable jQuery Bootstrap spreadsheet from MindMup</title>
	
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="keywords" content="opensource jquery bootstrap editable table spreadsheet" />
    <meta name="description" content="This tiny jQuery bootstrap plugin turns any table into an editable spreadsheet" />
    <link rel="apple-touch-icon" href="https://d1g6a398qq2djm.cloudfront.net/img/apple-touch-icon.png" />
    <link rel="shortcut icon" href="https://d1g6a398qq2djm.cloudfront.net/img/favicon.ico" />
    <link href="external/google-code-prettify/prettify.css" rel="stylesheet">
    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.no-icons.min.css" rel="stylesheet">
    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-responsive.min.css" rel="stylesheet">
		<link href="//netdna.bootstrapcdn.com/font-awesome/3.0.2/css/font-awesome.css" rel="stylesheet">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
    <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
    <script src="external/google-code-prettify/prettify.js"></script>
		<link href="index.css" rel="stylesheet">
    <script src="mindmup-editabletable.js"></script>
    <script src="numeric-input-example.js"></script>
  </head>
  <body>
<div class="container">
  <div class="hero-unit">
  <div class="pull-right">
	<div class="fb-like" data-href="https://facebook.com/mindmupapp" data-send="false" data-layout="button_count" data-width="100" data-show-faces="false"></div><br/>
    <a href="https://twitter.com/mindmup" class="twitter-follow-button" data-show-count="true" data-show-screen-name="true" data-lang="en">Follow @mindmup</a> 
  </div>
	<h1>editableTableWidget<br/> <small>tiny editable jQuery Bootstrap spreadsheet</small></h1>
	<hr/>
		<div class="alert alert-error hide">
			That would cost too much
		</div>
          <table id="mainTable" class="table table-striped">
            <thead><tr><th>Name</th><th>Cost</th><th>Profit</th><th>Fun</th></tr></thead>
            <tbody>
              <tr><td>Car</td><td>100</td><td>200</td><td>0</td></tr>
              <tr><td>Bike</td><td>330</td><td>240</td><td>1</td></tr>
              <tr><td>Plane</td><td>430</td><td>540</td><td>3</td></tr>
              <tr><td>Yacht</td><td>100</td><td>200</td><td>0</td></tr>
              <tr><td>Segway</td><td>330</td><td>240</td><td>1</td></tr>
            </tbody>
			<tfoot><tr><th><strong>TOTAL</strong></th><th></th><th></th><th></th></tr></thead>
          </table>
          <h2><small>just start typing to edit, or move around with arrow keys or mouse clicks!</small></h2>
</div>
<div class="row">
    <div class="span6">
          <h2>About</h2>
          <p>
		  This <a href="https://github.com/mindmup/editable-table/blob/master/mindmup-editabletable.js">tiny (3KB, &lt; 120 lines) jQuery plugin</a> turns any 
		  table into an editable spreadsheet. 
          Here are the key features:
      </p>
          <ul>
            <li>No magic - works on a normal HTML table (so you can plug it in into any web table, and apply any JS function to calculate values)</li>
            <li>Supports validation and change events (so you can warn about invalid input or prevent invalid changes)</li>
            <li>Uses standard DOM focus for selection (so does not interrupt scrolling or tabbing outside the table)</a></li>
			<li>Input automatically copies underlying table cell styling</li>
            <li>Native copy/paste support</li>
            <li>Does not force any styling (so you can style it any way you want, using normal CSS)</li>
			<li>Works well with Bootstrap</li>
			<li>Depends only on jQuery</li>
			<li>Tested in Chrome 32, Firefox 26, IE 10, Safari 7, Android Chrome and iOS 7 Safari</li>
      </ul>


      <h2>Usage</h2>
<pre class="prettyprint ">
$('#table').editableTableWidget();
</pre>    
<p>Use a text area instead of input field to input (or supply a custom editor element)</p>
<pre class="prettyprint ">
$('#table').editableTableWidget({editor: $('&lt;textarea&gt;')});
</pre>
<p>Make sure that the editor clones some specific CSS properties of the underlying cell</p>
<pre class="prettyprint ">
$('#table').editableTableWidget({
	cloneProperties: ['background', 'border', 'outline']
});
</pre>
<p>Mark content as invalid during editing (for example, change one of the item names above to blank or try to enter a non-numeric cost)</p>
<pre class="prettyprint">
$('table td').on('validate', function(evt, newValue) {
	if (....) { 
		return false; // mark cell as invalid 
	}
});
</pre>
<p>Act on a change (or even reject it). This is how the numbers above recalculate. Also, try to increase total cost over 5000!</p>
<pre class="prettyprint">
$('table td').on('change', function(evt, newValue) {
	// do something with the new cell value 
	if (....) { 
		return false; // reject change
	}
});
</pre>
    </div>
    <div class="span6" >
        <h2>Why?</h2>

        <a href="https://www.mindmup.com"><img class="span5" src="https://mindmup.github.io/promo-868x350.png"></a>
        <br clear="all" />
        <p>
		We built a tabular data editor for <a href="https://www.mindmup.com">MindMup</a>. Yes, there are plenty of existing widgets such as this, but
		the ones we could find were either too magic (automatically generated tables with custom styles, interrupting normal focus flow, faking selection with background styles, flash-based copy-paste) 
		or too big (good ones start at 200KB).</p>
		<p>MindMup targets recent browsers, so with HTML5, everything we need can fit into less than 3K. We built this tiny tiny 
		editor that does everything we need, does not impose
          any particular additional CSS, does not fight DOM but uses it as normal, works well with Bootstrap styling, and fits nicely into jQuery event processing. </p>
          <p>It's released under the MIT license, so fork and enjoy!  </p>
		<h2>FAQ</h2>
		<h4>Can the widget insert rows and columns?</h4>
		<p>It works on your HTML table. Just use normal DOM manipulation to insert rows and cells. You don't need to extend the widget for that. You can bind a keystroke to the table or some buttons to do that, for example.</p>
		<h4>Can the widget apply numeric functions?</h4>
		<p>It works on your HTML table. Just use normal javascript/DOM manipulation to calculate stuff. Listen to the change event and recalculate (<a href="https://github.com/mindmup/editable-table/blob/master/numeric-input-example.js">see an example</a>).</p>
		<h4>Can the widget sync with a background data model?</h4>
		<p>It works on your HTML table, so just use HTML5 data binding or whatever you would normally use to sync with the DOM, and normal javascript/DOM manipulation to update. You don't need to tell the widget about updates.
		To sync in the other direction, subscribe to the change event.</p>
		<h4>How do I post data to my server?</h4>
		<p>It works on your HTML table, so use standard DOM functions to pull the data from the table, and use jQuery to post to the server</p> 
		<h4>What other widgets are there?</h4>
		<p>This widget is intentionally minimalistic. If you need more magic and "it works on your HTML table" is not a good answer for you, then check out <a href="http://handsontable.com/">HandsonTable</a> or <a href="https://github.com/mleibman/SlickGrid">SlickGrid</a>.</p>   


          
		</div>
	</div>
	<div class="row">
		<div class="span6 offset3">
			 <p style="text-align:center;">
				<a class="btn btn-large btn-primary jumbo" href="https://github.com/mindmup/editable-table">View project on Github</a>
				<a class="btn btn-large jumbo" href="mailto:contact@mindmup.com"><i class="icon-envelope"></i></a>
          <a class="btn btn-large jumbo" href="https://facebook.com/mindmupapp"><i class="icon-facebook"></i></a>
          <a class="btn btn-large jumbo" href="https://twitter.com/mindmup"><i class="icon-twitter"></i></a>
          <a class="btn btn-large jumbo" href="https://plus.google.com/u/0/communities/112831595986131146219"><i class="icon-google-plus"></i></a>
        </p>
		</div>
	</div>
</div>

<script>
  $('#mainTable').editableTableWidget().numericInputExample().find('td:first').focus();
  $('#textAreaEditor').editableTableWidget({editor: $('<textarea>')});
  window.prettyPrint && prettyPrint();
</script>
<a href="https://github.com/mindmup/editable-table"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png" alt="Fork me on GitHub"></a>
<div id="fb-root"></div>
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-37452180-6', 'github.io');
  ga('send', 'pageview');
</script>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));
 </script>

<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
      
  </body>
</html>
